//
// Created by Sugars Mac on 2020/5/25.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <netinet/in.h>
#include <arpa/inet.h> // for inet_pton
#include <pthread.h>

#include <unistd.h>

#define BUFFSIZE 128
#define HOST_IP "192.168.1.101"
#define PORT 8000

int sockfd;

void snd();

void sig_pipe(int sign)
{
    printf("服务器关闭了链接，请重新链接\n");
    exit(0);
    /*释放资源*/
}

int main()
{
    signal(SIGPIPE, sig_pipe);	/*挂接SIGPIPE信号，处理函数为sig_pipe()*/

    pthread_t thread;       // pthread_t pthread
    struct sockaddr_in serv_addr;   // struct sockaddr_in
    char buf[BUFFSIZE * 10];
    //
    bzero(&serv_addr, sizeof(struct sockaddr_in));  // bzero
    serv_addr.sin_family = AF_INET;         // sin_family   AF_INET
    serv_addr.sin_port = htons(PORT);       // sin_port     htons(PORT)
    inet_pton(AF_INET, HOST_IP, &serv_addr.sin_addr);        // inet_pton
    //
    sockfd = socket(AF_INET, SOCK_STREAM, 0);       // socket
    if(sockfd < 0)
    {
        perror("fail to socket");
        exit(-1);
    }
    //
    printf("connecting... \n");
    if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) // connect
    {
        perror("fail to connect");
        exit(-2);
    }
    //
    pthread_create(&thread, NULL, (void *)(&snd), NULL);    // pthread_create
    //
    while(1)
    {
        int len;
        if((len=read(sockfd, buf, BUFFSIZE * 10)) > 0)       // 一接受到服务端发来的数据就打印
        {
            if (strcmp(buf, "DISC") == 0) { // 服务器主动断开客户端
                break;
            } else if (strcmp(buf, "OFFL") == 0) {
                write(sockfd, "QUIT", 4);
                continue;
            }
            printf("%s", buf);
            printf(">");
            fflush(stdout);         // 强制将缓冲区内容打印到屏幕
            memset(buf, 0, BUFFSIZE * 10);
        }
    }
    return 0;
}

void snd()
{
    char buf[BUFFSIZE];

//    fgets(input, 32, stdin); // 获得用户名称
//    write(sockfd, input, strlen(input));
    while(1)
    {
        memset(buf, 0, BUFFSIZE);
        fgets(buf, BUFFSIZE, stdin); // 读取用户输入
        buf[strlen(buf)-1] = '\0'; // 除去换行符！！
        write(sockfd, buf, strlen(buf));
        if(strcmp(buf, "DISC") == 0) {
            exit(0);
        }
        printf(">");
    }
}
